class Prop():
    def __init__(self,attrname):
        self.attr = f'_{attrname}'
    def get(self,instance): # getter方法，通过 property对象，可以把被propperty代理的类的当前正在被使用的实例 传过来（也就是这个 instance）
        if hasattr(instance,self.attr):
            return getattr(instance, self.attr)
        else:
            setattr(instance,self.attr,None)
            return None
    def set(self,instance,val): # setter方法
        setattr(instance,self.attr,val)

class Human(type):
    @staticmethod
    def __new__(cls, *args, **kwargs):
        class_ = super().__new__(cls,*args) # 常规的创建对应类
        propsNames = class_.props # 获取 类属性也就是 props = ['name','age'] 这个东西
        for propName in propsNames:
            pp = Prop(propName) # 为每一个属性 创建一个 Prop对象
            p = property(fset=pp.set,fget=pp.get) # 为每个属性创建property对象
            setattr(class_,propName,p) # 将property对象设置到类属性上（注：property对象只能设置在类属性上面）

        return class_


class Student(object,metaclass=Human):
    props = ['name','age']

student = Student()
print(student.name)
print(student.age)
student.name = 'kangkang'
print(student.name)
